
# 定义基类，让AdminScope 、UserScope都有add方法添加权限
class Scope:
    allow_api = []
    allow_module = []
    forbidden_api = []
    def add(self,other):
        self.allow_api = self.allow_api + other.allow_api
        # 去重， 因为多次add或者+ 可能会有重复的视图被加进来， 先转成set在转成list进行去重； 或者在定义allow_api时候就用set集合
        self.allow_api = list(set(self.allow_api))

        # 让模块支持 + 符号 来增加权限
        self.allow_module = self.allow_module + other.allow_module
        self.allow_module = list(set(self.allow_module))

        # 禁止访问的api
        self.forbidden_api = self.forbidden_api + other.forbidden_api
        self.forbidden_api = list(set(self.forbidden_api))

        return self # 让其支持链式调用

    def __add__(self, other):
        return self.add(other)

# 管理员权限类
class AdminScope(Scope):
    # 允许访问的api视图
    # allow_api = ['v1.user+get_user_by_token']

    # 允许user模块下所有的api
    allow_module = ['v1.user']

    # 管理员要包含普通用户的模块，这里这里把普通用户的模块添加到管理员上
    def __init__(self):
        # self.allow_api = self.allow_api + UserScope.allow_api

        # self.add(UserScope())
        # self + UserScope() # 重写了Scope类的 __add__ 方法就相当于 + 操作，让类也支持了 + 操作
        pass



# 普通用户权限类
class UserScope(Scope):
    allow_api = ['v1.user+get_user_by_uid']
    # allow_module = ['v1.user']
    forbidden_api = ['v1.user+delete_user'] # 普通用户不能访问删除用户的api


def is_in_scope(scope, endpoint):
    # globals()[scope]() 通过一个类的名字，得到一个类的对象
    scope = globals()[scope]()  # scope：值可能是 AdminScope 、 UserScope， 然后实例化类

    splits = endpoint.split('+') # app/libs/RedPrint.py 中register方法的endpoint 加上了模块名称， 用 + 拼接的所有用 + 分割
    red_model_name = splits[0]


    if endpoint in scope.forbidden_api:  # 禁止访问的
        return False

    if endpoint in scope.allow_api:
        return True

    if red_model_name in scope.allow_module:
        return True
    else:
        return False